
package capa_persistencia;

import capa_logica.Actor;
import capa_logica.Avion;
import capa_logica.Drone;
import capa_logica.Escenario;
import capa_logica.Obstaculo;
import capa_logica.Partida;
import capa_logica.Piloto;
import capa_logica.Tanque;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Timer;
import java.util.logging.Level;
import java.util.logging.Logger;

// Esta clase crea la conexión a la Base de Datos y ejecuta las consultas
public class AccesoBD 
{
    public void crearBD(Connection con)
    {
        try 
        {
            Consultas c = new Consultas();
            String s = c.crearBD();
            PreparedStatement pstmt = con.prepareStatement(s);
            pstmt.executeUpdate();
            pstmt.close();
        } 
        catch (SQLException ex) 
        {
            Logger.getLogger(AccesoBD.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    public void crearTablaEscenario(Connection con)
    {
        try 
        {
            Consultas c = new Consultas();
            String s = c.crearTablaEscenarios();
            PreparedStatement pstmt = con.prepareStatement(s);
            pstmt.executeUpdate();
            pstmt.close();
        } 
        catch (SQLException ex) 
        {
            Logger.getLogger(AccesoBD.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    public void crearTablaPartidas(Connection con)
    {
        try 
        {
            Consultas c = new Consultas();
            String s = c.crearTablaPartidas();
            PreparedStatement pstmt = con.prepareStatement(s);
            pstmt.executeUpdate();
            pstmt.close();
        } 
        catch (SQLException ex) 
        {
            Logger.getLogger(AccesoBD.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    public void crearTablaActores(Connection con)
    {
        try 
        {
            Consultas c = new Consultas();
            String s = c.crearTablaActores();
            PreparedStatement pstmt = con.prepareStatement(s);
            pstmt.executeUpdate();
            pstmt.close();
        } 
        catch (SQLException ex) 
        {
            Logger.getLogger(AccesoBD.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    public void crearTablaPilotos(Connection con)
    {
        try 
        {
            Consultas c = new Consultas();
            String s = c.crearTablaPilotos();
            PreparedStatement pstmt = con.prepareStatement(s);
            pstmt.executeUpdate();
            pstmt.close();
        } 
        catch (SQLException ex) 
        {
            Logger.getLogger(AccesoBD.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    public void crearTablaAviones(Connection con)
    {
        try 
        {
            Consultas c = new Consultas();
            String s = c.crearTablaAviones();
            PreparedStatement pstmt = con.prepareStatement(s);
            pstmt.executeUpdate();
            pstmt.close();
        } 
        catch (SQLException ex) 
        {
            Logger.getLogger(AccesoBD.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    public void crearTablaTanques(Connection con)
    {
        try 
        {
            Consultas c = new Consultas();
            String s = c.crearTablaTanques();
            PreparedStatement pstmt = con.prepareStatement(s);
            pstmt.executeUpdate();
            pstmt.close();
        } 
        catch (SQLException ex) 
        {
            Logger.getLogger(AccesoBD.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    public void crearTablaDrones(Connection con)
    {
        try 
        {
            Consultas c = new Consultas();
            String s = c.crearTablaDrones();
            PreparedStatement pstmt = con.prepareStatement(s);
            pstmt.executeUpdate();
            pstmt.close();
        } 
        catch (SQLException ex) 
        {
            Logger.getLogger(AccesoBD.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    public void crearTablaObstaculos(Connection con)
    {
        try 
        {
            Consultas c = new Consultas();
            String s = c.crearTablaObstaculos();
            PreparedStatement pstmt = con.prepareStatement(s);
            pstmt.executeUpdate();
            pstmt.close();
        } 
        catch (SQLException ex) 
        {
            Logger.getLogger(AccesoBD.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    public void insertarEscenario(Connection con, int id, String nom)
    {
        try 
        {
            Consultas c = new Consultas();
            String s = c.insertarEscenario();
            PreparedStatement pstmt = con.prepareStatement(s);
            pstmt.setInt(1, id);
            pstmt.setString(2, nom);
            pstmt.executeUpdate();
            pstmt.close();
        } 
        catch (SQLException ex) 
        {
            Logger.getLogger(AccesoBD.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    public void insertarPartida(Connection con, int idPar, int idEsc, int min, int seg)
    {
        try 
        {
            Consultas c = new Consultas();
            String s = c.insertarPartida();
            PreparedStatement pstmt = con.prepareStatement(s);
            pstmt.setInt(1, idPar);
            pstmt.setInt(2, idEsc);
            pstmt.setInt(3, min);
            pstmt.setInt(4, seg);
            pstmt.executeUpdate();
            pstmt.close();
        } 
        catch (SQLException ex) 
        {
            Logger.getLogger(AccesoBD.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    public void insertarActor(Connection con, int idAct, int posX, int posY, int ene, int idPar, int ori)
    {
        try 
        {
            Consultas c = new Consultas();
            String s = c.insertarActor();
            PreparedStatement pstmt = con.prepareStatement(s);
            pstmt.setInt(1, idAct);
            pstmt.setInt(2, posX);
            pstmt.setInt(3, posY);
            pstmt.setInt(4, ene);
            pstmt.setInt(5, idPar);
            pstmt.setInt(6, ori);
            pstmt.executeUpdate();
            pstmt.close();
        } 
        catch (SQLException ex) 
        {
            Logger.getLogger(AccesoBD.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    public void insertarPiloto(Connection con, int idAct, boolean dro)
    {
        try 
        {
            Consultas c = new Consultas();
            String s = c.insertarPiloto();
            PreparedStatement pstmt = con.prepareStatement(s);
            pstmt.setInt(1, idAct);
            pstmt.setBoolean(2, dro);
            pstmt.executeUpdate();
            pstmt.close();
        } 
        catch (SQLException ex) 
        {
            Logger.getLogger(AccesoBD.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    public void insertarAvion(Connection con, int idAct, int bal, int bom)
    {
        try 
        {
            Consultas c = new Consultas();
            String s = c.insertarAvion();
            PreparedStatement pstmt = con.prepareStatement(s);
            pstmt.setInt(1, idAct);
            pstmt.setInt(2, bal);
            pstmt.setInt(3, bom);
            pstmt.executeUpdate();
            pstmt.close();
        } 
        catch (SQLException ex) 
        {
            Logger.getLogger(AccesoBD.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    public void insertarTanque(Connection con, int idAct, int mun)
    {
        try 
        {
            Consultas c = new Consultas();
            String s = c.insertarTanque();
            PreparedStatement pstmt = con.prepareStatement(s);
            pstmt.setInt(1, idAct);
            pstmt.setInt(2, mun);
            pstmt.executeUpdate();
            pstmt.close();
        } 
        catch (SQLException ex) 
        {
            Logger.getLogger(AccesoBD.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    public void insertarDrone(Connection con, int idAct)
    {
        try 
        {
            Consultas c = new Consultas();
            String s = c.insertarDrone();
            PreparedStatement pstmt = con.prepareStatement(s);
            pstmt.setInt(1, idAct);
            pstmt.executeUpdate();
            pstmt.close();
        } 
        catch (SQLException ex) 
        {
            Logger.getLogger(AccesoBD.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    public void insertarObstaculo(
            Connection con, int idEsc, int posX, int posY, int base, int altura, char tip)
    {
        try 
        {
            Consultas c = new Consultas();
            int clave = contarObstaculos(con) + 1;            
            String s = c.insertarObstaculo();            
            PreparedStatement pstmt = con.prepareStatement(s);
            
            pstmt.setInt(1, clave);
            pstmt.setInt(2, idEsc);
            pstmt.setInt(3, posX);
            pstmt.setInt(4, posY);
            pstmt.setString(5, String.valueOf(tip));
            pstmt.setInt(6, (base));
            pstmt.setInt(7, (altura));
            pstmt.executeUpdate();
            pstmt.close();
        } 
        catch (SQLException ex) 
        {
            Logger.getLogger(AccesoBD.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    public ArrayList<Obstaculo> cargarObstaculos(Connection con, int idEsc) throws SQLException
    {
        Consultas c = new Consultas();
        String s = c.cargarObstaculos();
        PreparedStatement pstmt = con.prepareStatement(s);
        pstmt.setInt(1, idEsc);
        ResultSet rs = pstmt.executeQuery();
        ArrayList<Obstaculo> obs = new ArrayList<Obstaculo>();
        while(rs.next())
        {
            int clave = rs.getInt("Clave");
            int x = rs.getInt("posicionX");
            int y = rs.getInt("posicionY");
            String t = rs.getString("Tipo");
            int b = rs.getInt("Base");
            int a = rs.getInt("Altura");
            char tipo = t.charAt(0);
            Obstaculo o = new Obstaculo(clave, x, y, a, b, tipo);
            obs.add(o);
        }
        rs.close();
        pstmt.close();
        return obs;
    }
    
    public Obstaculo cargarObstaculo(Connection con, int clave)
    {
        Obstaculo o = null;
        try 
        {
            Consultas c = new Consultas();
            String s = c.cargarObstaculo();
            PreparedStatement pstmt = con.prepareStatement(s);
            pstmt.setInt(1, clave);
            ResultSet rs = pstmt.executeQuery();
            if(rs.next())
            {
                int x = rs.getInt("posicionX");
                int y = rs.getInt("posicionY");
                String t = rs.getString("Tipo");
                int b = rs.getInt("Base");
                int a = rs.getInt("Altura");
                char tipo = t.charAt(0);
                o = new Obstaculo(clave, x, y, a, b, tipo);
                System.out.println("OBSTACULO CREADO");
            }
        } 
        catch (SQLException ex) 
        {
            Logger.getLogger(AccesoBD.class.getName()).log(Level.SEVERE, null, ex);
        }
        return o;
    }
    
    public Escenario cargarEscenario(Connection con, int idEsc) throws SQLException
    {
        Consultas c = new Consultas();
        String s = c.cargarEscenario();
        PreparedStatement pstmt = con.prepareStatement(s);
        pstmt.setInt(1, idEsc);
        ResultSet rs = pstmt.executeQuery();
        Escenario e;
        if(rs.next())
        {
            e = new Escenario(idEsc, "");
            e.setId(rs.getInt("IdEscenario"));
            e.setNombre(rs.getString("Nombre"));
        }
        else
        {
            throw new SQLException("No existe un Escenario con este ID");
        }
        rs.close();
        pstmt.close();
        return e;
    }
    
    public int cargarTiempoPartida(Connection con, int idPar) throws SQLException
    {
        Consultas c = new Consultas();
        String s = c.cargarTiempoPartida();
        PreparedStatement pstmt = con.prepareStatement(s);
        pstmt.setInt(1, idPar);
        ResultSet rs = pstmt.executeQuery();
        int min;
        int seg;
        if(rs.next())
        {
            min = rs.getInt("Minutos");
            seg = rs.getInt("Segundos");
        }
        else
        {
            throw new SQLException("No existe una Partida con este ID");
        }
        rs.close();
        pstmt.close();
        return (min * 60) + seg;
    }
    
    public Partida cargarPartida(Connection con, int idPar) throws SQLException
    {
        Consultas c = new Consultas();
        String s = c.cargarPartida();
        PreparedStatement pstmt = con.prepareStatement(s);
        pstmt.setInt(1, idPar);
        ResultSet rs = pstmt.executeQuery();
        Partida p;
        if(rs.next())
        {
            Escenario e = cargarEscenario(con, rs.getInt("IdEscenario"));
            Timer temporizador = new Timer("");
            p = new Partida(e, temporizador);
            p.setMinutos(rs.getInt("Minutos"));
            p.setSegundos(rs.getInt("Segundos"));
        }
        else
        {
            throw new SQLException("No existe una Partida con este ID");
        }
        rs.close();
        pstmt.close();
        return p;
    }
    
    public Piloto cargarPiloto(Connection con, int idPar, Escenario e) throws SQLException
    {
        Consultas c = new Consultas();
        String s = c.cargarPiloto();
        PreparedStatement pstmt = con.prepareStatement(s);
        pstmt.setInt(1, idPar);
        ResultSet rs = pstmt.executeQuery();
        Piloto p = new Piloto(0,0,0,0,0,0,0,0,e);
        if(rs.next())
        {
            p.setLlamoDrone(rs.getBoolean("LlamoDrone"));
            p.setPosicionX(rs.getInt("PosicionX"));
            p.setPosicionY(rs.getInt("PosicionY"));
            p.setEnergia(rs.getInt("Energia"));
            p.setOrientacion(rs.getInt("Orientacion"));
            
            p.setVelocidad(Partida.VEL_PILOTO);
            p.setVision(Partida.VIS_PILOTO);
            p.setLargo(Partida.LARGO_PILOTO);
            p.setAncho(Partida.ANCHO_PILOTO);
        }
        else
        {
            throw new SQLException("No existe una Partida con este ID");
        }
        rs.close();
        pstmt.close();
        return p;
    }
    
    public Drone cargarDrone(Connection con, int idPar, Escenario e) throws SQLException
    {
        Consultas c = new Consultas();
        String s = c.cargarDrone();
        PreparedStatement pstmt = con.prepareStatement(s);
        pstmt.setInt(1, idPar);
        ResultSet rs = pstmt.executeQuery();
        Drone d = new Drone(0, 0, 0, 0, 0, 0, 0, 0, e);
        
        if(rs.next())
        {
            d.setPosicionX(rs.getInt("PosicionX"));
            d.setPosicionY(rs.getInt("PosicionY"));
            d.setEnergia(rs.getInt("Energia"));
            d.setOrientacion(rs.getInt("Orientacion"));
            
            d.setVelocidad(Partida.VEL_PILOTO);
            d.setVision(Partida.VIS_PILOTO);
            d.setLargo(Partida.LARGO_PILOTO);
            d.setAncho(Partida.ANCHO_PILOTO);
        }
        else
        {
            throw new SQLException("No existe una Partida con este ID");
        }
        rs.close();
        pstmt.close();
        return d;
    }
    
    public ArrayList<Tanque> cargarTanque(Connection con, int idPar, Escenario e) throws SQLException
    {
        Consultas c = new Consultas();
        String s = c.cargarTanques();
        PreparedStatement pstmt = con.prepareStatement(s);
        pstmt.setInt(1, idPar);
        ResultSet rs = pstmt.executeQuery();
        ArrayList<Tanque> tqs = new ArrayList<Tanque>();
        
        while(rs.next())
        {
            int d = rs.getInt("Municion");
            int px = rs.getInt("PosicionX");
            int py = rs.getInt("PosicionY");
            int en = rs.getInt("Energia");
            int o = rs.getInt("Orientacion");
            Tanque t = new Tanque(px,py,en,0,0,0,0,o,e);
            t.setVelocidad(Partida.VEL_TANQUE);
            t.setVision(Partida.VIS_TANQUE);
            t.setLargo(Partida.LARGO_TANQUE);
            t.setAncho(Partida.ANCHO_TANQUE);
            tqs.add(t);
        }
        rs.close();
        pstmt.close();
        return tqs;
    }
        
    public Avion cargarAvion(Connection con, int idPar, Escenario e) throws SQLException
    {
        Consultas c = new Consultas();
        String s = c.cargarAvion();
        PreparedStatement pstmt = con.prepareStatement(s);
        pstmt.setInt(1, idPar);
        ResultSet rs = pstmt.executeQuery();
        Avion a = new Avion(0,0,0,0,0,0,0,0,e,null,null);
        
        if(rs.next())
        {
            a.setBalas(rs.getInt("Balas"));
            a.setBombas(rs.getInt("Bombas"));
            a.setVelocidad(Partida.VEL_AVION);
            a.setVision(Partida.VIS_AVION);
            a.setLargo(Partida.LARGO_AVION);
            a.setAncho(Partida.ANCHO_AVION);
        }
        else
        {
            throw new SQLException("No existe una Partida con este ID");
        }
        rs.close();
        pstmt.close();
        return a;
    }
    
    public int contarPartidas(Connection con)
    {
        int n = -1;
        
        try 
        {
            Consultas c = new Consultas();
            String s = c.contarPartidas();
            PreparedStatement pstmt = con.prepareStatement(s);
            ResultSet rs = pstmt.executeQuery();
            if(rs.next())
            {
                n = rs.getInt("IdPartida");
            }
        } 
        catch (SQLException ex) 
        {
            Logger.getLogger(AccesoBD.class.getName()).log(Level.SEVERE, null, ex);
        }
        return n;
    }
    
    public int contarActores(Connection con)
    {
        int n = -1;
        
        try 
        {
            Consultas c = new Consultas();
            String s = c.contarActores();
            PreparedStatement pstmt = con.prepareStatement(s);
            ResultSet rs = pstmt.executeQuery();
            if(rs.next())
            {
                n = rs.getInt("IdActor");
            }
        } 
        catch (SQLException ex) 
        {
            Logger.getLogger(AccesoBD.class.getName()).log(Level.SEVERE, null, ex);
        }
        return n;
    }
    
    public int contarObstaculos(Connection con)
    {
        int n = -1;
        
        try 
        {
            Consultas c = new Consultas();
            String s = c.contarObstaculos();
            PreparedStatement pstmt = con.prepareStatement(s);
            ResultSet rs = pstmt.executeQuery();
            if(rs.next())
            {
                n = rs.getInt("Clave");
            }
        } 
        catch (SQLException ex) 
        {
            Logger.getLogger(AccesoBD.class.getName()).log(Level.SEVERE, null, ex);
        }
        return n;
    }
}
